package com.css.upms.biz.controller;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.css.common.core.utils.R;
import com.css.common.core.utils.UUIDUtils;
import com.css.common.security.support.CssUser;
import com.css.common.security.utils.SecurityUtil;
import com.css.lion.optlog.agent.annotation.OptLog;
import com.css.upms.api.dto.UserDTO;
import com.css.upms.api.dto.UserDeptDTO;
import com.css.upms.api.dto.UserPasswordDTO;
import com.css.upms.api.dto.UserQueryDTO;
import com.css.upms.api.entity.SysUser;
import com.css.upms.api.vo.UserInfo;
import com.css.upms.biz.service.SysUserDeptService;
import com.css.upms.biz.service.SysUserService;
import com.fasterxml.jackson.annotation.JsonView;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

/**
 * 用户管理
 *
 * @author hanyx
 * @date 2019-05-03 00:48:40
 */
@RestController
@AllArgsConstructor
@RequestMapping("/user")
@Api(value = "/user", tags = {"UPMS-用户管理"})
@Slf4j
public class UserController {

    private final SysUserService userService;

    private final SysUserDeptService userDeptService;

    /**
     * 获取当前用户全部信息
     *
     * @return 用户信息
     */
    @ApiOperation("获取当前用户全部信息")
    @GetMapping(value = {"/info"})
    public R userInfo() {
        CssUser cssUser = SecurityUtil.getUser();
        if (cssUser == null) {
            return R.buildError("当前用户未登录");
        }
        String username = cssUser.getUsername();
        UserInfo userInfo = userService.getUserInfo(username);
        if (userInfo == null) {
            return R.buildError("获取当前用户信息失败");
        }
        return new R<>(userInfo);
    }

    /**
     * 获取指定用户全部信息
     *
     * @return 用户信息
     */
    @ApiOperation("获取指定用户全部信息")
    @GetMapping("/info/{username}")
    public R userInfo(@PathVariable String username) {
        if (StringUtils.isBlank(username)) {
            return R.buildError("用户账号不能为空");
        }
        UserInfo userInfo = userService.getUserInfo(username);
        if (userInfo == null) {
            return R.buildError(String.format("用户信息为空 %s", username));
        }
        return R.buildSuccess(userInfo);
    }

    /**
     * 通过条件查询用户VO信息
     *
     * @param userDTO
     * @return 用户信息
     */
    @ApiOperation("通过条件查询用户VO信息")
    @GetMapping("/vo")
    @JsonView(UserQueryDTO.UserSimpleDTO.class)
    public R vo(UserQueryDTO userDTO) {
        return new R<>(userService.getUserVo(userDTO));
    }

    /**
     * 添加用户
     *
     * @param userDto 用户信息
     * @return success/false
     */
    @ApiOperation(value = "新增用户")
    @OptLog(desc = "用户管理", opt = "新增用户")
    @PostMapping
//  @PreAuthorize("hasAuthority('api_user_add')")
    public R user(@RequestBody UserDTO userDto) {
        userDto.setUserId(UUIDUtils.get32UUID());
        return userService.saveUser(userDto);
    }

    /**
     * 删除用户信息
     *
     * @param userId
     * @return R
     */
    @DeleteMapping("/{userId}")
    @OptLog(desc = "用户管理", opt = "删除用户")
    @ApiOperation(value = "删除用户")
//  @PreAuthorize("@hasAuthority('api_user_del')")
    public R userDel(@PathVariable String userId) {
        if (StringUtils.isBlank(userId)) {
            return R.buildError("用户id不能为空");
        }
        SysUser sysUser = userService.getById(userId);
        return new R<>(userService.removeUserById(sysUser));
    }

    /**
     * 更新用户信息
     *
     * @param userDTO 用户信息
     * @return R
     */
    @ApiOperation("更新用户信息")
    @OptLog(desc = "用户管理", opt = "更新用户信息")
    @PutMapping
//    @PreAuthorize("@hasAuthority('sys_user_edit')")
    public R updateUser(@Valid @RequestBody UserDTO userDTO) {
        return new R<>(userService.updateUser(userDTO));
    }

    /**
     * 分页查询用户
     *
     * @param page         参数集
     * @param UserQueryDTO 查询参数列表
     * @return 用户集合
     */
    @ApiOperation("分页查询用户")
    @GetMapping("/page")
    public R getUserPage(Page page, UserQueryDTO UserQueryDTO) {
        return new R<>(userService.getUserWithRolePage(page, UserQueryDTO));
    }

    @ApiOperation("修改个人密码by管理员 无旧密码验证")
    @OptLog(desc = "用户管理", opt = "管理员身份修改密码")
    @PutMapping("/password/admin")
    public R updateUserPasswordByAdmin(@Valid @RequestBody UserPasswordDTO userDto) {
        if (StringUtils.isBlank(userDto.getNewpassword1())) {
            return R.buildError("新密码不能为空");
        }
        return userService.updateUserPassword(userDto, true);
    }

    @ApiOperation("修改个人密码")
    @PutMapping("/password")
    @OptLog(desc = "用户管理", opt = "修改密码")
    public R updateUserPassword(@Valid @RequestBody UserPasswordDTO userDto) {
        if (StringUtils.isBlank(userDto.getNewpassword1())) {
            return R.buildError("新密码不能为空");
        }
        return userService.updateUserPassword(userDto, false);
    }

    /**
     * @param username 用户名称
     * @return 上级部门用户列表
     */
    @ApiOperation("上级部门用户列表")
    @GetMapping("/ancestor/{username}")
    public R listAncestorUsers(@PathVariable String username) {
        if (StringUtils.isBlank(username)) {
            return R.buildError("用户账号不能为空");
        }
        return new R<>(userService.listAncestorUsersByUsername(username));
    }


    /**
     * 更新用户机构
     *
     * @param userDeptDTO 用户ID
     *                    机构ID拼成的字符串，每个id之间根据逗号分隔
     * @return success、false
     */
    @ApiOperation("更新用户机构")
    @OptLog(desc = "用户管理", opt = "更新用户机构")
    @PutMapping("/dept")
//    @PreAuthorize("@hasAuthority('sys_dept_perm')")
    public R saveUserDepts(@Valid @RequestBody UserDeptDTO userDeptDTO) {
        if (StringUtils.isBlank(userDeptDTO.getUserId())) {
            return R.buildSuccess(Boolean.FALSE);
        }
        return new R<>(userDeptService.saveUserDepts(userDeptDTO.getUserId(), userDeptDTO.getDeptIds()));
    }

    /**
     * @param deptId 部门ID
     * @return 获取指定部门下所有用户集合
     */
    @ApiOperation("获取指定部门下所有用户集合")
    @GetMapping("/list/{deptId}")
    public R userListByDeptId(@PathVariable String deptId) {
        if (StringUtils.isBlank(deptId)) {
            return R.buildError("部门id不能为空");
        }
        return new R<>(userService.list(Wrappers.<SysUser>query().lambda()
                .eq(SysUser::getDeptId, deptId)));
    }

}
